package com.example.car

import android.app.DatePickerDialog
import android.icu.util.Calendar
import androidx.activity.viewModels

import androidx.recyclerview.widget.LinearLayoutManager
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.ToastUtils
import com.example.car.adapter.CarStopAdapter
import com.example.car.databinding.ActivityCarStopBinding
import com.example.car.vm.CarStopViewModel
import com.example.common.view.view.BaseMvvmActivity
import dagger.hilt.android.AndroidEntryPoint

/**
 * 停车记录展示页面
 * 该 Activity 负责展示用户车辆的停车记录列表，并支持按日期筛选。
 * 用户可以通过点击日期选择控件选择目标日期，系统将加载该日期的停车记录。
 */
@Route(path = "/car/CarStopActivity")
@AndroidEntryPoint
class CarStopActivity : BaseMvvmActivity<ActivityCarStopBinding>() {

    /**
     * 获取当前页面对应的布局资源 ID
     * @return 返回布局文件 R.layout.activity_car_stop 的资源 ID
     */
    override fun getLayoutId(): Int = R.layout.activity_car_stop

    private val carStopViewModel: CarStopViewModel by viewModels()

    val carStopAdapter = CarStopAdapter()

    /**
     * 初始化界面组件和事件监听
     * 包括设置日期选择器、返回按钮、默认加载当天数据、配置 RecyclerView，
     * 以及观察 ViewModel 中的数据变化并更新 UI。
     */
    override fun initView() {
        super.initView()

        // 获取当前日历实例并提取年月日
        val calendar = Calendar.getInstance()
        val year = calendar.get(Calendar.YEAR)
        val month = calendar.get(Calendar.MONTH)
        val day = calendar.get(Calendar.DAY_OF_MONTH)

        // 设置点击事件，弹出日期选择对话框
        mDataBinding.ivDateTime.setOnClickListener {
            val datePickerDialog = DatePickerDialog(this, { _, sYear, sMonth, sDay ->
                // 格式化选中的日期并显示在 TextView 上
                mDataBinding.tvDateTime.text = "${sYear}/${sMonth + 1}/${sDay}"
                // 请求获取对应日期的停车记录
                carStopViewModel.getCarStop()
            }, year, month, day)
            datePickerDialog.show()
        }
        mDataBinding.back.setOnClickListener {
            finish()
        }
        // 默认加载当天的停车记录
        carStopViewModel.getCarStop()

        // 设置 RecyclerView 的适配器和布局管理器
        mDataBinding.rv.adapter = carStopAdapter
        mDataBinding.rv.layoutManager = LinearLayoutManager(this)

        // 观察成功获取数据的 LiveData，并更新适配器中的数据
        carStopViewModel.mSuccessLiveData.observe(this) {
            carStopAdapter.data.clear()
            // 过滤出与当前选中日期匹配的记录
            val selectedDate = mDataBinding.tvDateTime.text.toString()
            carStopAdapter.data.addAll(
                it.data.filter { payment ->
                    val entryTime = payment.entryTime
                    if (entryTime.isNotEmpty()){
                        val datePart = entryTime.split(" ")[0]
                        formatDateString(datePart) == formatDateString(selectedDate)
                    } else {
                        false
                    }
//                    it.entryTime.substring(0..7).equals(mDataBinding.tvDateTime.text.toString())
                }
            )
            carStopAdapter.notifyDataSetChanged()
        }

        // 观察错误信息的 LiveData，并以 Toast 形式提示用户
        carStopViewModel.mErrorLiveData.observe(this) {
            ToastUtils.showLong(it)
        }
        carStopAdapter.setOnItemClickListener { adapter, view, position ->
                ARouter.getInstance().build( "/car/CarPayActivity")
                .withString("carCode",carStopAdapter.getItem(position).plateNumber)
                .navigation()
        }
    }

    /**
     * 格式化日期字符串为统一格式（yyyy/MM/dd）
     * @param dateStr 输入的日期字符串，预期格式为 "yyyy/M/d" 或类似形式
     * @return 返回格式化后的日期字符串，格式为 "yyyy/MM/dd"
     */
    private fun formatDateString(dateStr: String): String {
        val parts = dateStr.split("/")
        return if (parts.size == 3){
            val year = parts[0]
            val month = parts[1].padStart(2,'0')
            val day = parts[2].padStart(2,'0')
            "$year/$month/$day"
        } else {
            dateStr
        }
    }
}
